Node 无法启动, 使用 kubectl describe pod calico-node-xxxxx -n kube-system 查看 Pod 的状态,发现存活探针失败,导致 Pod 不断重启, 期间尝试了重置节点,重新部署 Calico Node,但是问题依然存在。这样断断续续排查了一周,问题还是没有解决。 看来这个模块并不是必须的,那这个信息也不是导致 Calico Node 无法启动的原因了。 在 Google 上搜索 nf_conntrack_proto_sctp ubuntu 22.04 ,第一条搜索结果标题就是 Calico Node keeps restarting with CrashLoopBackOff Node 的 pod,再次创建,果然正常启动了。
文章目录 Calico 网络模型 Calico网络的转发细节 路由配置组件Felix 路由广播组件BGP Speaker Calico 架构 Calico全景架构图 全连接复杂性与规模问题 大规模部署架构图 这个agent在Calico中称为Felix。 ---- 路由广播组件BGP Speaker 在Calico中,每个Node上运行一个软件BIRD,作为BGP的客户端,或者叫作BGP Speaker,将“如何到达我这个Node,访问我这个Node上的容器 所有Node上的BGPSpeaker 都互相建立连接,就形成了全互连的情况,这样每当路由有所变化的时候,所有节点就都能够收到了。 ---- Calico 架构 Calico全景架构图 全连接复杂性与规模问题 这里面还存在问题,就是BGP全连接的复杂性问题。
一、关于 Calico Felix, Typha 和 kube-controllers 组件 Felix 是一个守护进程,运行在每台机器上实现网络策略等功能,Felix 是 calico 的大脑。 二、 配置 calico 允许 metrics 上报 1. name: calico-felix-metrics namespace: calico-system spec: selector: k8s-app: calico-node name: calico-typha-metrics namespace: calico-system spec: selector: k8s-app: calico-typha name: calico-kube-controllers-metrics namespace: calico-system spec: selector: k8s-app: calico-kube-controllers
在这篇文章中,我们将对 Calico 和 Flannel 进行对比,以帮助您选择最适合您的 Kubernetes 网络插件。实现方式Calico 使用基于路由的方法实现网络功能。 此外,Calico 的路由表也非常小,因为每个容器只需要一个路由规则。这使得 Calico 在大规模部署时非常适用。 配置和部署Calico 的配置和部署相对来说比较复杂,因为它需要为每个节点设置路由规则。 安全性Calico 和 Flannel 都提供了一定程度的安全性。Calico 可以通过网络策略来控制容器之间的通信,Flannel 则使用网络策略来限制容器之间的通信。 扩展性Calico 的扩展性非常好,因为它使用的是基于路由的方法,可以轻松地与其他路由器和防火墙集成。此外,Calico 还支持多种路由协议,可以与多种网络拓扑结构集成。
前言 Calico 是一个纯三层的数据中心网络方案,而且无缝集成像 OpenStack 这种 Iaas 云架构,能够提供可控的 VM、容器、裸机之间的 IP 通信。为什么说它是纯三层呢? Calico 网络模型揭秘 下面我们通过具体的例子来帮助大家理解 Calico 网络的通信原理。 所以 Calico 是怎么做到的呢? 这里我就不绕弯子了,实际上 Calico 利用了网卡的代理 ARP 功能。 现在我们知道,Calico 本质上还是利用了代理 ARP 撒了一个“善意的谎言”,下面我们来确认一下。 模拟组网 既然我们已经掌握了 Calico 的组网原理,接下来就可以手动模拟验证了。
Calico 作为一种常用的 Kubernetes 网络插件,使用 BGP 协议对各节点的容器网络进行路由交换。 本文是《Calico BGP 功能介绍》系列的第一篇,介绍 Calico 所使用的 BGP 软件路由器——BIRD。 关于 BGP 协议,网上资料众多,在这里不再做介绍。 reject "RIP metric is too big"; else accept "ok"; } 常见协议 这里只介绍 Calico get_doc&v=20&f=bird.html#toc5 原文链接:https://maao.cloud/2021/01/26/Calico-BGP%E5%8A%9F%E8%83%BD%E4%BB%8B
-allowprivileged=true(因为calico-node需要以特权模式运行在各Node上)。 设置各Node上kubelet服务的启动参数:--networkplugin=cni(使用CNI网络插件) 创建Calico服务,主要包括calico-node和calico policy controller 在每个Node上都运行calico/node容器,部署为DaemonSet 在每个Node上都安装Calico(由install-cni容器完成) 部署一个名为calico/kube-policy-controller /calico-node created daemonset.apps/calico-node created serviceaccount/calico-node created deployment.apps /calicoctl node status Calico process is running.
1 Calico默认的网络模式是IPIP2 切换到BGP网络模式2.1 确保安装了calicoctl工具2.2 配置一个global BGP peerglobal BGP peer是确保和集群其他calico apiVersion: projectcalico.org/v3kind: BGPPeermetadata: name: my-global-peerspec: peerIP: 192.20.30.40 # 每个calico node都和该地址建立peer asNumber: 645672.3 为每个calico node配置BGP peerapiVersion: projectcalico.org/v3kind: BGPPeermetadata name: rack1-torspec: peerIP: 192.20.30.40 asNumber: 64567 nodeSelector: rack == 'rack-1' # 可以基于标签操作calico 为该node打一个标签更便于其他node与其建立BGP peer:kubectl label node {node-name} route-reflector=true使用如下配置建立RR组网:kind
不同于Flannel,Calico是通过BGP(Border Gateway Protocol 边界网关协议)来自动的在集群中分发路由信息。 明白了BGP的大体工作原理后,其Calico的工作架构就非常容易理解,它由三部分组成: Calico的CNI插件; Felix,负责在宿主机上插入路由规则以及维护Calico所需的网络设备; BIRD, 如上就是Calico的工作原理(Calico不会在宿主机上创建任何网桥设备,这与Flannel是不同的)。 Node-to-Node Mesh Calico的默认模式是Node-to-Node Mesh,这种模式下,所有主机上的BGP Client都需要与其他主机进行通信交换路由规则信息,但是随着节点N的增加 在Calico的IPIP模式下,Felix进程就会在Node上添加如下路由规则,如Node1: 10.233.2.0/24 via 192.168.2.2 tunl0 其中的tunl0就是一个IP Tunnel
Calico 组件 下图显示了 Kubernetes 的必需和可选 Calico 组件,具有网络和网络策略的本地部署。 注意:calico/node 可以在仅策略模式下运行,其中 Felix 在没有 BIRD 和 confd 的情况下运行。这提供了无需在主机之间分配路由的策略管理,并用于托管云提供商等部署。 Calico CNI 插件允许您将 Calico 网络用于任何使用 CNI 网络规范的编排器。通过标准的 CNI 配置机制和 Calico CNI 插件进行配置。 RBAC 控制对 Calico 资源的访问 使用 Kubernetes 审计日志生成 Calico 资源更改的审计日志 etcd etcd 是一个一致的、高可用性的分布式键值存储,它为 Calico 这允许 Calico 与编排器紧密绑定,因此用户可以使用他们的编排工具管理 Calico 网络。需要时,编排器插件会从 Calico 网络向编排器提供反馈。
nodeSelector 用于通过标签来选择一组 node,作为 BGP Peer 应用的节点,注意这里的 node 为 Calico 中的 node,而非 K8s 中的 node。 如果指定了此字段,则 node 应该为空。 peerSelector 用于通过标签来选择一组 node(同样为 Calico 中的 node),作为远端 Peer 的节点。 主要参数包括: 参数 描述 默认值 nodeToNodeMeshEnabled 开启 Calico 节点之间的 node-to-node mesh。 true asNumber Calico node 默认的节点 AS。 默认情况下,Calico 所有节点通过 IBGP 来交换各个节点的 workload(容器)路由信息,由于从 IBGP Peer 中学习到的路由不会被再次转发,因此需要使用 node-to-node mesh
Route Reflector 模式(RR)(路由反射):Calico 维护的网络在默认是(Node-to-Node Mesh)全互联模式,Calico集群中的节点之间都会相互建立连接,用于路由交换。 而 Flannel host-gw 和 Calico 的唯一不一样的地方就是当数据包下一跳到达node2节点容器时发生变化,并且出数据包也发生变化,知道它是从veth的设备流出,容器里面的数据包到达宿主机上 维护的网络在默认是 (Node-to-Node Mesh)全互联模式,Calico集群中的节点之间都会相互建立连接,用于路由交换。 (可以使用大规模方式解决) 每个node上会设置大量(海量)的iptables规则、路由,运维、排障难度大。 原理决定了它不可能支持VPC,容器只能从calico设置的网段中获取ip。 status 如果使用 calicoctl get node,需要指定 calicoctl 配置,默认使用 /etc/calico/calicoctl.cfg # 设置 calicoctl 配置文件
触发准入 Webhook PodMutatingHandler 处理请求,检查是否为 VMI 资源 根据操作类型调用相应的处理函数 查询对应的 PersistentPodState 对象 如果存在,添加 Calico
node name identifying the Calico node instance that is targeted by this peer. /node or calico/felix container. /templates/calico-node-rbac.yaml # Include a clusterrole for the calico-node DaemonSet, # and bind it name: calico-node namespace: kube-system --- # Source: calico/templates/calico-node.yaml # This manifest namespace: kube-system labels: k8s-app: calico-node spec: selector: matchLabels: k8s-app: calico-node
grep 9091 tcp LISTEN 0 4096 [::]:9091 [::]:* users:(("calico-node PodMonitor 虽然不需要应用创建相应的 Service,但必须在 Pod 中指定指标的端口和名称,因此需要先修改 DaemonSet calico-node 的配置,指定端口和名称。 先用以下命令打开 DaemonSet calico-node 的配置: $ kubectl -n kube-system edit ds calico-node 然后在线修改,在 spec.template.sepc.containers namespaceSelector: matchNames: - kube-system selector: matchLabels: k8s-app: calico-node 注意 Labels 中有 pod="calico-node-xxx",表明监控的是 Pod。 3. 可视化监控指标 采集完指标之后,就可以通过 Grafana 的仪表盘来展示监控指标了。
[root@localhost ~]# hostname node1 [root@localhost ~]# bash [root@node1 ~]# node2 [root@localhost ~] -i node2 #将hosts文件传给node1和node2 [root@master ~]# scp /etc/hosts node1:/etc/hosts hosts -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 部署calico /v3.9/getting-started/kubernetes/ calico,同样在master节点上操作 # 在k8s中安装calico kubectl apply -f https:/ /docs.projectcalico.org/v3.9/manifests/calico.yaml # 确认一下calico是否安装成功 kubectl get pods --all-namespaces
本文将介绍如何在Kubernetes集群中安装和配置Calico网络插件。 二、安装Calico下载Calico安装文件首先需要从Tigera官方网站下载最新版本的Calico安装文件。 安装Calico安装Calico非常简单,只需要使用kubectl命令将calico.yaml文件应用到Kubernetes集群中即可:$ kubectl apply -f calico.yaml这将自动在 三、使用Calico安装和配置Calico后,可以使用以下命令检查Calico的状态:$ calicoctl node status此命令将列出Kubernetes集群中所有节点的状态。 此外,可以使用以下命令查看Calico网络中的所有端点:$ calicoctl get endpoints此命令将列出Calico网络中的所有端点,包括它们的名称、IP地址和状态等。
之前详细介绍了calico的ipip、vxlan、bgp模式, 但是所有的k8s节点都是同网段的, 本篇使用ensp和workstation在自己家里就可以模拟测试跨网段k8s集群calico方案的纯bgp , 配置bgp主要分为以下步骤 确认calico部署是纯BGP模式 关闭BGP默认的full mesh模式 修改指定主机k8s-node3和k8s-node4的bgp as number值为64513 给所有主机打标签进行bgp as分组, 满足bpg peer选择特定的peer对等体 创建bgp peer, 通过第四步打的标签让rr client与rr建立ibgp关系 确认calico-node的如下两个配置为 Never - name: CALICO_IPV4POOL_IPIP value: "Never" - name: CALICO_IPV4POOL_VXLAN value: "Never kubectl label nodes k8s-node2 node=node2 kubectl label nodes k8s-node1 node=node1 创建calico的bgp peer
目录 目录 calico 名词解释 组网原理 BGP与AS BGP Speaker 全互联模式(node-to-node mesh) BGP Speaker RR模式 calico网络的部署 calico calico的每个node上会设置大量(海量)的iptables规则、路由,运维、排障难度大。 calico的原理决定了它不可能支持VPC,容器只能从calico设置的网段中获取ip。 calico目前的实现没有流量控制的功能,会出现少数容器抢占node多数带宽的情况。 calico的网络规模受到BGP网络规模的限制。 calico中也可以通过node Peer手动构建BGP Speaker(也就是node)之间的BGP连接。 pull docker.io/calico/node 启动felix: calicoctl node run --node-image=docker.io/calico/node:latest 下面是启动过程中日志
设置Master上kube-apiserver服务的启动参数:--allow-privileged=true(因为calico-node需要以特权模式运行在各Node上)。 创建Calico服务,主要包括calico-node和calico policy controller。 创建Secret calico-etcd-secrets,用于使用TLS方式连接etcd。 在每个Node上都运行calico/node容器,部署为DaemonSet。 calico-node:Calico服务程序,用于设置Pod的网络资源,保证Pod的网络与各Node互联互通。它还需要以hostNetwork模式运行,直接使用宿主机网络。 如上可查看到不同节点的相应路由,从而通过Calico就完成了Node间容器网络的设置。